package com.bdzl.credit.service.impl;


import com.bdzl.credit.common.enums.BrEnum;
import com.bdzl.credit.service.CreditReportService;
import com.bdzl.credit.servicefeign.FeignAdminService;
import com.bdzl.pub.time.DateUtils;
import com.bdzl.pub.util.file.DownFileUtil;
import com.bdzl.pub.util.file.OssUploadFileUtil;
import com.bdzl.pub.util.xss.HttpRequest;
import com.bfd.facade.MerchantServer;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.File;
import java.util.HashMap;
import java.util.Map;


@Controller
@RequestMapping("/bdzl/creditReport")
public class CreditReportServiceImpl implements CreditReportService {
    @Autowired
    private FeignAdminService feignAdminService;
    /**
     * 策略贷前、验证接口
     */
    private static MerchantServer ms = new MerchantServer();
    //可以使用正式环境接口地址  LoginApi(正式环境)   SandboxLoginApi(测试环境)
    private String loginName = "SandboxLoginApi";
    //接口地址
    //接口地址(apiName传以下参数)---
    //	贷前策略地址：strategyApi(正式环境)		SandboxstrategyApi(测试环境)
    //	验证策略地址：verificationApi (正式地址)	SandboxverApi(测试地址)
    //注：1.测试过程可以使用正式地址
    //   2.apiName环境要保持与loginName环境一致,正式都是正式、测试都是测试,不可以交叉使用.
    //   3.在调用测试环境时需要事先联系百融技术并提供apicode及策略编号（策略编号请查看邮件里的策略配置表）
    private String apiName = "SandboxLoginApi";

    /**
     * 获取配置参数 策略引擎接口
     * @param name 名称
     * @param call 手机号
     * @param id 身份证号
     * @param strategyType 策略类型
     * @param strategyNumber 策略编号
     * @return brData 查询生成的状态码 以及 流水号
     */
    @Override
    public JSONObject CreditReport(String name,String call,String id,String strategyType,String strategyNumber) {
        JSONObject jsonData = new JSONObject();
        JSONObject reqData = new JSONObject();
        jsonData.put("apiName",apiName);
        //百融登录的tokenId
        jsonData.put("tokenid",generateToken());
        //验证的策略编号(请查看策略配置表)
        reqData.put(strategyType,strategyNumber);
        //请求参数 id cell name (如产品文档有其他必传参数按照产品文档为主)
        reqData.put("id",id);//身份证号
        reqData.put("cell",call);//电话
        reqData.put("name",name);//名字
        jsonData.put("reqData",reqData);
        System.out.println("请求参数:"+jsonData.toString());
        JSONObject brData = getBrData(jsonData.toString());
        System.out.println("返回值:"+brData);
        return brData;
    }


    /**
     * 获取百融登录的tokenId
     * @return
     */
    @Override
    public  String generateToken(){
        String token="";
        try{
            String userName = feignAdminService.getByConfigNo(BrEnum.百融API帐户名.getValue()).getConfigVal();
            String password = feignAdminService.getByConfigNo(BrEnum.百融API帐户名密码.getValue()).getConfigVal();
            String apiCode = feignAdminService.getByConfigNo(BrEnum.百融apicode.getValue()).getConfigVal();
            //访问百融登录接口 使用 userName：用户名  password：密码   loginName：访问地址  和 apicode 获取tokenid
            String login_res_str = ms.login(userName,password,loginName,apiCode);
            if(StringUtils.isNotBlank(login_res_str)){
                JSONObject loginJson = JSONObject.fromObject(login_res_str);
                if(loginJson.containsKey("tokenid")){
                    //取出tokenid
                    token = loginJson.getString("tokenid");
                }else {
                    System.out.println("返回结果异常，无token!结果为:"+login_res_str);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return token;
    }


    /**
     * 策略引擎接口
     * @param jsonStr 配置以及 参数
     * @return json 状态码 和 流水号
     */
    @Override
    public  JSONObject getBrData(String jsonStr){
        JSONObject json = null;
        try {
            //调用接口 获取返回的状态码 和 流水号
            String apiCode = feignAdminService.getByConfigNo(BrEnum.百融apicode.getValue()).getConfigVal();
            String res = ms.getApiData(jsonStr,apiCode);
            if(StringUtils.isNotBlank(res)){
                json = JSONObject.fromObject(res);
                if(json.containsKey("code")&&json.getString("code").equals("100007")){
                    return null;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return json;
    }


    /***
     * 获取客户端嵌入式报告的token
     * @return token
     */
    @Override
    public String getWebToken()
    {
        String token="";
        Map<String,String> map=new HashMap<String,String>();
        //网页客户端账号
        String webUserName = feignAdminService.getByConfigNo(BrEnum.嵌入式页面用户名.getValue()).getConfigVal();
        map.put("username", webUserName);
        //网页客户端密码
        String webPwd = feignAdminService.getByConfigNo(BrEnum.嵌入式页面密码.getValue()).getConfigVal();
        map.put("password",webPwd);
        //访问百融接口
        String tokeinIdJson= HttpRequest.doPost("https://apiservice.100credit.com/api/auth-service/auth/getToken",map);
        JSONObject jsonObject= JSONObject.fromObject(tokeinIdJson);
        if(jsonObject!=null&&"000000".equals(jsonObject.getString("code"))){
            //获取客户端嵌入式报告的token
            token=jsonObject.getString("data");
        }else{
            token = null;
        }
        return token;
    }




    /**
     * @Author Zhn
     * @Description //TODO 业务系统使用 根据百融的征信报告接口查询地址下载pdf并返回pdf地址
     * @Date 18:27 2021/5/24
     * @Param [name, call, id, code] 名称 手机号 身份证号 流水号
     * @return java.lang.String  百融征信报表pfd的阿里云oss地址
     **/
    @Override
    public String getBrPdfUrl(String id,String code){
        //获取客户端嵌入式报告的tokenId
        String sessionId=getWebToken();
        if (sessionId==null){
            return "100";
        }
        //获得pdf下载的地址
        String urls = "https://loanexamine.100credit.com/api/approval-service/examine/history/singlePdfExport?swift_number="+code+"&sessionId="+sessionId;
        try {
            //下载pdf
            File file = DownFileUtil.downLoadFromUrlHttps(urls, id + DateUtils.getNow());
            //上传到阿里云
            urls = OssUploadFileUtil.RandomFileName.uploadToOSS(file, "loan/credit_report");
            return urls;
        } catch (Exception e) {
            e.printStackTrace();
            return "500";
        }
    }

}
